package base

import (
	"fmt"
	"gitee.com/slion/infra"
	"github.com/sirupsen/logrus"
	"net"
	"net/rpc"
	"reflect"
)

// rpcServer
var rpcServer *rpc.Server

// 对外获取rpcServer的方法
func GetRPCServer() *rpc.Server{
	return rpcServer
}

// 注册RPC方法
func RPCRegister(method interface{}){
	typ := reflect.TypeOf(method)
	logrus.Infof("rpc register: %s\n", typ.String())
	err := rpcServer.Register(method)
	if err != nil {
		logrus.Errorf("rpc register err: %s\n", err.Error())
	}
}

type RPCStarter struct {
	infra.BaseStarter
}

func (r *RPCStarter) Init(ctx infra.StartContext) {
	// NewServer创建并返回一个*Server
	rpcServer = rpc.NewServer()
}

func (r *RPCStarter) Start(ctx infra.StartContext) {

	port := GetProps("app.rpc.port")
	address := fmt.Sprintf(":%s", port)
	// 返回在一个本地网络地址laddr上监听的Listener
	listener, err := net.Listen("tcp", address)
	if err != nil {
		logrus.Panic(err)
	}
	logrus.Info(fmt.Sprintf("rpc server listening on: %s", address))
	// Accept接收监听器获取的连接,然后服务每一个连接
	go rpcServer.Accept(listener)
}
